package com.nt.train.config;

import com.nt.train.service.ListService;
import com.nt.train.service.condition.*;
import com.nt.train.service.express.ExpressFalseBean;
import com.nt.train.service.express.ExpressTrueBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
/**
 * https://blog.csdn.net/feiying0canglang/article/details/124509399
 * 表达式演示
 * @author hlf
 * @version 1.0
 * @date 2022/8/4 11:17
 */
@Configuration
public class ExpressAutoConfig {

    /**
     * 当存在配置，且配置为true时才创建这个bean
     * @return
     */
    @Bean
    @ConditionalOnExpression("#{'true'.equals(environment['conditional.express'])}")
    public ExpressTrueBean expressTrueBean() {
        return new ExpressTrueBean("express true");
    }

    /**
     * 配置不存在，或配置的值不是true时，才创建bean
     * @return
     */
    @Bean
    @ConditionalOnExpression("#{!'true'.equals(environment.getProperty('conditional.express'))}")
    public ExpressFalseBean expressFalseBean() {
        return new ExpressFalseBean("express != true");
    }



    /**
     单个值（key必须存在，且value必须是指定值）
     @ConditionalOnProperty("config1.enable", havingValue="true")

     单个值（key必须存在，不关心value）
     @ConditionalOnProperty("config1.enable")

     多个值（多个key必须存在，且value必须都是指定值）
     @ConditionalOnProperty(name={"config1.enable","config.all"}, havingValue="true")

     多个值（多个key必须存在，不关心value）
     @ConditionalOnProperty(name={"config1.enable","config.all"})

     @ConditionalOnClass
     用法1：通过class指定
      import a.b.c.Xxx;
     @ConditionalOnClass(Xxx.class)
     也可以指定多个
     import a.b.c.Xxx;
     @ConditionalOnClass({Xxx.class, Yyy.class})
     用法2：通过类的全路径名指定
     @ConditionalOnClass("a.b.c.Xxx")
     也可以指定多个
     @ConditionalOnClass({"a.b.c.Xxx", "a.b.c.Yyy"})

     */
}
